﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Didsoft.SalesLive.Entidades;
using System.Collections.Generic;
using Didsoft.Silverlight.ViewModel.Commanding.Contracts;
using System.ServiceModel.DomainServices.Client;
using System.Linq;
using Didsoft.Silverlight.ViewModel;

namespace Didsoft.SalesLive.UI.Views.ViewModel
{
    public class VmUsuarioModal : ViewModelBase
    {
        #region Servicio
        
        private Didsoft.SalesLive.Negocios.UsuarioNegocios usuarioNegocios = new Negocios.UsuarioNegocios();        

        #endregion

        #region comandos

        #region CmdNuevo

        public ICommandEvent CmdNuevo { get; set; }
        public void CmdNuevo_Ejecutar(string param)
        {
            Usuario = new Usuario();
            CmdGuardar.RaiseCanExecuteChanged();

        }
        public bool CmdNuevo_PuedeEjecutar(string param)
        {
            return true;
        }

        #endregion

        #region CmdGuardar

        public ICommandEvent CmdGuardar { get; set; }
        public void CmdGuardar_Ejecutar(string param)
        {
            //personaNegocios.Personas.Detach(Usuario.Persona);
            //rolNegocios.Rols.Detach(Usuario.Rol);

            if (Usuario.Id == 0) usuarioNegocios.Usuarios.Add(Usuario);
            Guardar();

            Usuario = null;
            CmdGuardar.RaiseCanExecuteChanged();

        }
        
        public bool CmdGuardar_PuedeEjecutar(string param)
        {
            return Usuario != null;
        }

        #endregion

        #region CmdEliminar

        public ICommandEvent CmdEliminar { get; set; }
        public void CmdEliminar_Ejecutar(string param)
        {
            usuarioNegocios.Usuarios.Remove(Usuario);
            Guardar();
        }
        public bool CmdEliminar_PuedeEjecutar(string param)
        {
            return Usuario != null && usuarioNegocios.Usuarios.Contains(Usuario);
        }

        #endregion

        #endregion

        #region bindables

        private Usuario usuario;
        public Usuario Usuario
        {
            get { return usuario; }
            set { usuario = value; Notificar("Usuario"); }
        }

        private IEnumerable<Usuario> usuarios;
        public IEnumerable<Usuario> Usuarios
        {
            get { return usuarioNegocios.Usuarios; }            
        }


        private IEnumerable<Persona> personas;
        public IEnumerable<Persona> Personas
        {
            get { return personas ; }
            set { personas = value; Notificar("Personas"); }
        }

        private IEnumerable<Rol> roles;
        public IEnumerable<Rol> Roles
        {
            get { return roles; }
            set { roles = value; Notificar("Roles"); }
        }

        #endregion
        
        #region constructor

        public VmUsuarioModal()
        {
            CargarRoles();
            CargarUsuarios();
            CargarPersonas();
            InicializarComandos();
        }

       

        #endregion

        #region methods

        private void InicializarComandos()
        {
            CmdNuevo = new DelegateCommand<string>(CmdNuevo_Ejecutar, CmdNuevo_PuedeEjecutar);
            CmdGuardar = new DelegateCommand<string>(CmdGuardar_Ejecutar, CmdGuardar_PuedeEjecutar);
            CmdEliminar = new DelegateCommand<string>(CmdEliminar_Ejecutar, CmdEliminar_PuedeEjecutar);
        }

        private void CargarPersonas()
        {
            usuarioNegocios.Load<Persona>(usuarioNegocios.GetPersonasQuery(),
                                cargar =>
                                {
                                    if (cargar.HasError)
                                        cargar.MarkErrorAsHandled();
                                    else
                                        Personas = cargar.Entities;
                                }, null);
        }        

        private void CargarRoles()
        {
            usuarioNegocios.Load<Rol>(usuarioNegocios.GetRolesQuery(),
                                cargar =>
                                {
                                    if (cargar.HasError)
                                        cargar.MarkErrorAsHandled();
                                    else
                                        Roles = cargar.Entities;
                                }, null);
        }

        private void CargarUsuarios()
        {
            usuarioNegocios.Load<Usuario>(usuarioNegocios.GetUsuariosQuery(),
                                cargar =>
                                {
                                    if (cargar.HasError)
                                        cargar.MarkErrorAsHandled();
                                    else
                                        usuarios = cargar.Entities;

                                }, null);
        }

        private void Guardar()
        {
            usuarioNegocios.SubmitChanges(OnSubmitCompleted, null);
        }

        private void OnSubmitCompleted(SubmitOperation so)
        {
            if (so.HasError)
            {
                MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message));
                so.MarkErrorAsHandled();
            }
        }

        #endregion

    }
}
